package cn.security.config;

import cn.security.service.MySecurityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

//// 开启 Security ，
// 但是在 org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration 中的
// org.springframework.boot.autoconfigure.security.servlet.WebSecurityEnablerConfiguration 类上
// 已经标注 @EnableWebSecurity
//@EnableWebSecurity
@Configuration
public class MyConfig extends WebSecurityConfigurerAdapter {

    /**
     * 由于交给spring进行管理bean的生命周期，此处可以直接注入
     */
//    @Autowired
//    private MySecurityService mySecurityService;
//
//    @Override
//    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//        // 基于内存配置
////        auth.inMemoryAuthentication()
////                .withUser("xiangjiao")
////                .password(passwordEncoder().encode("bunana"))
////                .authorities("admin")
////                .and()
////                .withUser("123")
////                .password(passwordEncoder().encode("123456"))
////                .authorities("role");
//
//        // 基于   userDetailService
//        // UserAuthenticationServiceImpl 实现  UserDetailsService，可以直接传递
//        auth.userDetailsService(mySecurityService);
//    }

    /**
     * 申明 {bcrypt} 对应的 BCryptPasswordEncoder 密码编码器 bean 对象；
     * 在进行 cn.security.service.UserServiceImpl#loadUserByUsername(java.lang.String) 时，注入使用
     * @return
     */
    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
}
